package com.github.caijh.mall.store.service;

import java.io.IOException;
import java.util.List;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.caijh.mall.common.MyRecord;
import com.github.caijh.mall.common.PageParams;
import com.github.caijh.mall.front.request.IndexStoreProductSearchRequest;
import com.github.caijh.mall.store.model.StoreProduct;
import com.github.caijh.mall.store.request.StoreProductReqBody;
import com.github.caijh.mall.store.request.StoreProductSearchReqBody;
import com.github.caijh.mall.store.request.StoreProductStockRequest;
import com.github.caijh.mall.store.response.StoreProductTabsHeader;
import com.github.caijh.mall.store.response.StoreProductVo;
import org.json.JSONException;

public interface StoreProductService extends IService<StoreProduct> {

    IPage<StoreProductVo> page(StoreProductSearchReqBody request, PageParams pageParams);

    /**
     * H5端使用
     *
     * @param request
     * @param pageParams
     * @param productIdList
     * @return
     */
    List<StoreProduct> page(StoreProductSearchReqBody request, PageParams pageParams,
                            List<Integer> productIdList);

    /**
     * 获取产品列表H5
     *
     * @param request
     * @param pageParams
     * @return
     */
    List<StoreProduct> page(IndexStoreProductSearchRequest request, PageParams pageParams);

    /**
     * 基本参数获取
     *
     * @param storeProduct 产品参数
     * @return 商品结果
     */
    StoreProduct getByEntity(StoreProduct storeProduct);

    /**
     * 保存产品信息
     *
     * @param storeProductReqBody StoreProductReqBody
     */
    void save(StoreProductReqBody storeProductReqBody);

    /**
     * 更新产品信息
     *
     * @param storeProductReqBody
     * @return
     */
    void update(StoreProductReqBody storeProductReqBody);

    /**
     * 获取产品详情
     *
     * @param id 商品id
     * @return StoreProductResponse
     */
    StoreProductVo getByProductId(int id);

    /**
     * 获取tabsHeader对应数量
     *
     * @return
     */
    List<StoreProductTabsHeader> getTabsHeader();

    /**
     * 添加库存
     *
     * @param request
     * @return
     */
    boolean stockAddRedis(StoreProductStockRequest request);

    /**
     * 根据其他平台url导入产品信息
     *
     * @param url 待倒入平台的url
     * @param tag 待导入平台标识
     * @return 待导入的商品信息
     */
    StoreProductReqBody importProductFromUrl(String url, int tag) throws IOException, JSONException;

    /**
     * 获取推荐商品
     *
     * @param limit 最大数据量
     * @return 推荐商品集合
     */
    List<StoreProduct> getRecommendStoreProduct(Integer limit);

    /**
     * 扣减库存加销量
     *
     * @param productId 产品id
     * @param num       商品数量
     * @param type      是否限购 0=不限购
     * @return 扣减结果
     */
    boolean decProductStock(Integer productId, Integer num, Integer attrValueId, Integer type);

    List<Integer> getSecondaryCategoryByProductId(String productId);

    /**
     * 删除商品
     *
     * @param productId 商品id
     * @param type      类型：recycle——回收站 delete——彻底删除
     * @return 删除结果
     */
    boolean deleteProduct(Integer productId, String type);

    /**
     * 恢复已删除商品
     *
     * @param productId 商品id
     * @return 恢复结果
     */
    boolean reStoreProduct(Integer productId);

    /**
     * 后台任务批量操作库存
     */
    void consumeProductStock();

    /**
     * 扣减库存任务操作
     *
     * @param storeProductStockRequest 扣减库存参数
     * @return 执行结果
     */
    boolean doProductStock(StoreProductStockRequest storeProductStockRequest);

    /**
     * 获取复制商品配置
     */
    MyRecord copyConfig();

    /**
     * 复制平台商品
     *
     * @param url 商品链接
     * @return
     */
    MyRecord copyProduct(String url);

}
